package zw_101_200.zw_121_买卖股票的最佳时机;


class Solution {

    public static void main(String[] args) {
        int[] prices = {7, 1, 5, 3, 6, 4};
        int profit = maxProfit(prices);
        System.out.println(profit);

    }

    /**
     * 一次遍历
     * 时间复杂度：O(n)，只需要遍历一次。
     * 空间复杂度：O(1)，只使用了常数个变量。
     * @param prices
     * @return
     */
//    public static int maxProfit(int prices[]) {
//        int minprice = Integer.MAX_VALUE;
//        int maxprofit = 0;
//        for (int i = 0; i < prices.length; i++) {
//            if (prices[i] < minprice) {
//                minprice = prices[i];
//            } else if (prices[i] - minprice > maxprofit) {
//                maxprofit = prices[i] - minprice;
//            }
//        }
//        return maxprofit;
//    }



    /**
     * 动态规划
     * 时间复杂度：O(N)，遍历股价数组可以得到最优解；
     * 空间复杂度：O(N)，状态数组的长度为 N。
     * @param prices
     * @return
     */
    public static int maxProfit(int[] prices) {
        int len = prices.length;
        // 特殊判断
        if (len < 2) {
            return 0;
        }
        int[][] dp = new int[len][2];

        // dp[i][0] 下标为 i 这天结束的时候，不持股，手上拥有的现金数
        // dp[i][1] 下标为 i 这天结束的时候，持股，手上拥有的现金数

        // 初始化：不持股显然为 0，持股就需要减去第 1 天（下标为 0）的股价
        dp[0][0] = 0;
        dp[0][1] = -prices[0];

        // 从第 2 天开始遍历
        for (int i = 1; i < len; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
        }
        return dp[len - 1][0];
    }


    /**
     * 暴力解法
     * 思路：枚举所有发生一次交易的股价差。
     * 时间复杂度：O(N^2)，这里 N是股价数组的长度；
     * 空间复杂度：O(1)。
     * @param prices
     * @return
     */
//    public static int maxProfit(int[] prices) {
//        int len = prices.length;
//        int maxWin = 0;
//        for (int i = 0; i < len - 1; i++) {
//            for (int j = i + 1; j < len; j++) {
//                maxWin = (prices[j] - prices[i]) > maxWin ? prices[j] - prices[i] : maxWin;
//            }
//        }
//        return maxWin;
//    }
}
